home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / comm / term / term41source.lha / Extras / Source / gtlayout-Source.lha / LibCode.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  4KB  |  194 lines

  1. #define LIB_CODE 1
  2.  
  3. #include "gtlayout.h"
  4.  
  5. #include <dos/dos.h>
  6.  
  7. #include <exec/execbase.h>
  8. #include <exec/libraries.h>
  9.  
  10. #include <clib/exec_protos.h>
  11. #include <pragmas/exec_pragmas.h>
  12.  
  13. #include <clib/alib_protos.h>
  14.  
  15. STATIC struct Library * __asm __saveds    LibInit(register __a0 BPTR Segment,register __d0 struct Library *Base);
  16. STATIC struct Library * __asm __saveds    LibOpen(register __a6 struct Library *Base);
  17. STATIC BPTR __asm __saveds        LibExpunge(register __a6 struct Library *Base);
  18. STATIC BPTR __asm __saveds        LibClose(register __a6 struct Library *Base);
  19. STATIC LONG __asm __saveds        LibNull(register __a6 struct Library *Base);
  20.  
  21. extern __far struct Resident RomTag;
  22.  
  23. STATIC APTR LibVectors[] =
  24. {
  25.     LibOpen,
  26.     LibClose,
  27.     LibExpunge,
  28.     LibNull,
  29.  
  30.     LT_LevelWidth,
  31.     LT_DeleteHandle,
  32.     LT_CreateHandle,
  33.     LT_CreateHandleTagList,
  34.     LT_Rebuild,
  35.     LT_HandleInput,
  36.     LT_BeginRefresh,
  37.     LT_EndRefresh,
  38.     LT_GetAttributesA,
  39.     LT_SetAttributesA,
  40.     LT_AddA,
  41.     LT_NewA,
  42.     LT_EndGroup,
  43.     LT_LayoutA,
  44.     LT_LayoutMenusA,
  45.     LT_Fixed2String,
  46.     LT_String2Fixed,
  47.     LT_FixedMult,
  48.     LT_LabelWidth,
  49.     LT_LabelChars,
  50.     LT_LockWindow,
  51.     LT_UnlockWindow,
  52.     LT_DeleteWindowLock,
  53.     LT_ShowWindow,
  54.     LT_Activate,
  55.     LT_PressButton,
  56.     LT_GetCode,
  57.     LT_GetIMsg,
  58.     LT_ReplyIMsg,
  59.  
  60.     (APTR)-1
  61. };
  62.  
  63. STATIC struct ExecBase        *SysBase;
  64. STATIC struct SignalSemaphore     LockSemaphore;
  65.  
  66. struct Library            *UtilityBase;
  67.  
  68. extern UBYTE __far         LibName[],LibID[];
  69. extern LONG __far         LibVersion,LibRevision;
  70.  
  71. struct { ULONG DataSize; APTR Table; APTR Data; struct Library * (*Init)(); } __aligned LibInitTab =
  72. {
  73.     sizeof(struct Library),
  74.     LibVectors,
  75.     NULL,
  76.     LibInit
  77. };
  78.  
  79. STATIC BPTR LibSegment;
  80.  
  81. STATIC struct Library * __asm __saveds
  82. LibInit(register __a0 BPTR Segment,register __d0 struct Library *Base)
  83. {
  84.     Base -> lib_Node . ln_Type    = NT_LIBRARY;
  85.     Base -> lib_Node . ln_Name    = LibName;
  86.     Base -> lib_Flags        = LIBF_CHANGED | LIBF_SUMUSED;
  87.     Base -> lib_Version        = LibVersion;
  88.     Base -> lib_Revision        = LibRevision;
  89.     Base -> lib_IdString        = (APTR)LibID;
  90.  
  91.     LibSegment = Segment;
  92.  
  93.     SysBase = *(struct ExecBase **)4;
  94.  
  95.     InitSemaphore(&LockSemaphore);
  96.  
  97. #ifdef CPU_ANY
  98.     if(SysBase -> LibNode . lib_Version < 37)
  99. #else
  100.     if(SysBase -> LibNode . lib_Version < 37 || !(SysBase -> AttnFlags & AFF_68020))
  101. #endif    /* CPU_ANY */
  102.         return(NULL);
  103.     else
  104.         return(Base);
  105. }
  106.  
  107. STATIC struct Library * __asm __saveds
  108. LibOpen(register __a6 struct Library *Base)
  109. {
  110.     Base -> lib_Flags &= ~LIBF_DELEXP;
  111.  
  112.     Base -> lib_OpenCnt++;
  113.  
  114.     if(Base -> lib_OpenCnt == 1)
  115.     {
  116.         ObtainSemaphore(&LockSemaphore);
  117.  
  118.         if(UtilityBase = OpenLibrary("utility.library",0))
  119.         {
  120.             if(LT_Init())
  121.             {
  122.                 ReleaseSemaphore(&LockSemaphore);
  123.  
  124.                 return(Base);
  125.             }
  126.  
  127.             LT_Exit();
  128.  
  129.             CloseLibrary(UtilityBase);
  130.  
  131.             UtilityBase = NULL;
  132.         }
  133.  
  134.         ReleaseSemaphore(&LockSemaphore);
  135.  
  136.         return(NULL);
  137.     }
  138.     else
  139.         return(Base);
  140. }
  141.  
  142. STATIC BPTR __asm __saveds
  143. LibExpunge(register __a6 struct Library *Base)
  144. {
  145.     if(!Base -> lib_OpenCnt && LibSegment)
  146.     {
  147.         BPTR TempSegment = LibSegment;
  148.  
  149.         Remove((struct Node *)Base);
  150.  
  151.         FreeMem((BYTE *)Base - Base -> lib_NegSize,Base -> lib_NegSize + Base -> lib_PosSize);
  152.  
  153.         LibSegment = NULL;
  154.  
  155.         return(TempSegment);
  156.     }
  157.     else
  158.     {
  159.         Base -> lib_Flags &= ~LIBF_DELEXP;
  160.  
  161.         return(NULL);
  162.     }
  163. }
  164.  
  165. STATIC BPTR __asm __saveds
  166. LibClose(register __a6 struct Library *Base)
  167. {
  168.     Base -> lib_OpenCnt--;
  169.  
  170.     if(!Base -> lib_OpenCnt)
  171.     {
  172.         ObtainSemaphore(&LockSemaphore);
  173.  
  174.         LT_Exit();
  175.  
  176.         CloseLibrary(UtilityBase);
  177.  
  178.         UtilityBase = NULL;
  179.  
  180.         ReleaseSemaphore(&LockSemaphore);
  181.  
  182.         if(Base -> lib_Flags & LIBF_DELEXP)
  183.             return(LibExpunge(Base));
  184.     }
  185.  
  186.     return(NULL);
  187. }
  188.  
  189. STATIC LONG __asm __saveds
  190. LibNull(register __a6 struct Library *Base)
  191. {
  192.     return(NULL);
  193. }
  194.